home *** CD-ROM | disk | FTP | other *** search
/ Apple WWDC 1996 / WWDC96_1996 (CD).toast / Technology Materials / MacApp Release 10 / MacApp Release 10 - HD Ready / Examples / DemoText / UScriptMenu.cp < prev    next >
Encoding:
Text File  |  1996-04-03  |  11.9 KB  |  378 lines  |  [TEXT/MPS ]

  1. //----------------------------------------------------------------------------------------
  2. // UScriptMenu.cp 
  3. // Copyright © 1986-96 by Apple Computer, Inc. All rights reserved.
  4. //----------------------------------------------------------------------------------------
  5.  
  6. #ifndef __USCRIPTMENU__
  7. #include "UScriptMenu.h"
  8. #endif
  9.  
  10. // MacApp
  11.  
  12. #ifndef __UAPPLICATION__
  13. #include "UApplication.h"
  14. #endif
  15.  
  16. #ifndef __UMACAPPGLOBALS__
  17. #include "UMacAppGlobals.h"
  18. #endif
  19.  
  20. #ifndef __UMACAPPUTILITIES__
  21. #include "UMacAppUtilities.h"
  22. #endif
  23.  
  24. #ifndef __UMENUMGR__
  25. #include "UMenuMgr.h"
  26. #endif
  27.  
  28. #ifndef __UOSASCRIPT__
  29. #include "UOSAScript.h"
  30. #endif
  31.  
  32. #ifndef __USCRIPTING__
  33. #include "UScripting.h"
  34. #endif
  35.  
  36. // Toolbox
  37.  
  38. #ifndef __LOWMEM__
  39. #include <LowMem.h>
  40. #endif
  41.  
  42. //----------------------------------------------------------------------------------------
  43. // Global Functions: 
  44. //----------------------------------------------------------------------------------------
  45. OSErr GetAppLocation(short refNum,
  46.                      short& vRefNum,
  47.                      long& dirID,
  48.                      CStr255& fileName);
  49. void FindFiles(OSType theType,
  50.                OSType theCreator,
  51.                FSSpec& inFSSpec,
  52.                long& numToFind,
  53.                FSSpec* theFSSpecs);
  54.  
  55. //----------------------------------------------------------------------------------------
  56. // GetAppLocation: 
  57. //----------------------------------------------------------------------------------------
  58. #pragma segment AOpen
  59.  
  60. OSErr GetAppLocation(short refNum,
  61.                      short& vRefNum,
  62.                      long& dirID,
  63.                      CStr255& fileName)
  64. {
  65.     FCBPBRec pb;
  66.     OSErr error;
  67.  
  68.     pb.ioNamePtr = (StringPtr) & fileName;
  69.     pb.ioVRefNum = 0;
  70.     pb.ioRefNum = refNum;
  71.     pb.ioFCBIndx = 0;
  72.     error = PBGetFCBInfoSync(&pb);
  73.     vRefNum = pb.ioFCBVRefNum;
  74.     dirID = pb.ioFCBParID;
  75.     return (error);
  76. }
  77.  
  78. //----------------------------------------------------------------------------------------
  79. // FindFiles: 
  80. //----------------------------------------------------------------------------------------
  81.  
  82. void FindFiles(OSType theType,
  83.                OSType theCreator,
  84.                FSSpec& inFSSpec,
  85.                long& numToFind,
  86.                FSSpec* theFSSpecs)
  87. {
  88.     MAVolatileInit(Handle, buffer, NULL);
  89.     FailInfo fi;
  90.     Try(fi)
  91.     {
  92.         const short kBufferSize = 16384;
  93.         CInfoPBRec spec1, spec2;
  94.         CSParam pb;
  95.         short err = 0;
  96.         short bufferSize = kBufferSize;
  97.         Ptr bufferPtr = NULL;
  98.         buffer = TempNewHandle(kBufferSize, &err);
  99.         FailNIL(buffer);
  100.         HLock(buffer);
  101.         bufferPtr = *buffer;
  102.         spec1.hFileInfo.ioFlFndrInfo.fdType = theType;
  103.         spec1.hFileInfo.ioFlFndrInfo.fdCreator = theCreator;
  104.         spec1.hFileInfo.ioNamePtr = NULL;
  105.         spec1.hFileInfo.ioFlParID = inFSSpec.parID;
  106.  
  107.         spec2.hFileInfo.ioFlFndrInfo.fdType = (OSType)0xffffffff;
  108.         spec2.hFileInfo.ioFlFndrInfo.fdCreator = (OSType)0xffffffff;
  109.         spec2.hFileInfo.ioFlParID = inFSSpec.parID;
  110.         spec2.hFileInfo.ioNamePtr = NULL;
  111.         spec2.hFileInfo.ioFlFndrInfo.fdFlags = 0x0000;
  112.         spec2.hFileInfo.ioFlFndrInfo.fdLocation.h = 0x0000;
  113.         spec2.hFileInfo.ioFlFndrInfo.fdLocation.v = 0x0000;
  114.         spec2.hFileInfo.ioFlFndrInfo.fdFldr = 0x0000;
  115.  
  116.         pb.ioCompletion = NULL;
  117.         pb.ioNamePtr = NULL;
  118.         pb.ioMatchPtr = (FSSpecPtr)theFSSpecs;
  119.         pb.ioReqMatchCount = numToFind;
  120.         pb.ioSearchBits = fsSBFlFndrInfo + fsSBFlParID;
  121.         pb.ioSearchInfo1 = (CInfoPBPtr) & spec1;
  122.         pb.ioSearchInfo2 = (CInfoPBPtr) & spec2;
  123.         pb.ioSearchTime = 0;
  124.         pb.ioOptBuffer = bufferPtr;
  125.         pb.ioOptBufSize = bufferSize;
  126.  
  127.         pb.ioCatPosition.initialize = 0;
  128.         pb.ioVRefNum = inFSSpec.vRefNum;
  129.         err = PBCatSearchSync(&pb);
  130.         if ((err != noErr) && (err != -39))
  131.             FailOSErr(err);
  132.         numToFind = pb.ioActMatchCount;
  133.         buffer = DisposeIfHandle(buffer);
  134.         fi.Success();
  135.     }
  136.     else
  137.     {
  138.         buffer = DisposeIfHandle(buffer);
  139.         fi.ReSignal();
  140.     }
  141. }
  142.  
  143. //----------------------------------------------------------------------------------------
  144. // TScriptMenuBehavior
  145. //----------------------------------------------------------------------------------------
  146.  
  147. #undef Inherited
  148. #define Inherited TBehavior
  149.  
  150. #pragma segment ConstructorRes
  151. MA_DEFINE_CLASS_M1(TScriptMenuBehavior, Inherited);
  152.  
  153. //----------------------------------------------------------------------------------------
  154. // TScriptMenuBehavior::TScriptMenuBehavior: 
  155. //----------------------------------------------------------------------------------------
  156.  
  157. TScriptMenuBehavior::TScriptMenuBehavior()
  158. {
  159. }
  160.  
  161. //----------------------------------------------------------------------------------------
  162. // TScriptMenuBehavior destructor
  163. //----------------------------------------------------------------------------------------
  164. #pragma segment MADestructorRes
  165.  
  166. TScriptMenuBehavior::~TScriptMenuBehavior()
  167. {
  168. }
  169.  
  170. //----------------------------------------------------------------------------------------
  171. // TScriptMenuBehavior::IScriptMenuBehavior: 
  172. //----------------------------------------------------------------------------------------
  173. #pragma segment AOpen
  174.  
  175. void TScriptMenuBehavior::IScriptMenuBehavior()
  176. {
  177.     IBehavior('osas');
  178.     
  179.     if (HasAppleScript())
  180.     {
  181.         CStr63 globalsScriptName;
  182.         CStr63 sharedScriptName;
  183.         CStr63 startupScriptName;
  184.         CStr63 scriptFolderName;
  185.         GetIndString(scriptFolderName, kScriptMenuStrings, kFolderName);
  186.         GetIndString(globalsScriptName, kScriptMenuStrings, kGlobalsScript);
  187.         GetIndString(sharedScriptName, kScriptMenuStrings, kSharedScript);
  188.         GetIndString(startupScriptName, kScriptMenuStrings, kStartupScript);
  189.         
  190.         OSErr err = noErr;
  191.         long stdScriptsFound = 0;
  192.         ComponentInstance theCmp = COSAScript::GetDefaultComponent();
  193.         
  194.         InstallGlobalsScript(theCmp, scriptFolderName, globalsScriptName, stdScriptsFound);
  195.         InstallSharedScript(theCmp, sharedScriptName, stdScriptsFound);
  196.         ExecuteStartupScript(theCmp, startupScriptName, stdScriptsFound);
  197.         AddScriptMenu(globalsScriptName, sharedScriptName, startupScriptName, stdScriptsFound);
  198.     }
  199. }
  200.  
  201. //----------------------------------------------------------------------------------------
  202. // TScriptMenuBehavior::InstallGlobalsScript: 
  203. //----------------------------------------------------------------------------------------
  204. #pragma segment AOpen
  205.  
  206. void TScriptMenuBehavior::InstallGlobalsScript(ComponentInstance theCmp,
  207.                                                const CStr63& scriptFolderName,
  208.                                                const CStr63& globalsScriptName,
  209.                                                long& stdScriptsFound)
  210. {
  211.     COSAScript globalsScript;
  212.     OSErr err = noErr;
  213.     
  214.     CStr32 delimeter = HasAUX() ? "/" : ":";
  215.  
  216.     // Look for a globals script
  217.     CStr255 fileName;
  218.     short appRef = LMGetCurApRefNum();
  219.     FSSpec theSpec;
  220.     FailOSErr(GetAppLocation(appRef, theSpec.vRefNum, theSpec.parID, fileName));
  221.     fileName = delimeter + scriptFolderName + delimeter + globalsScriptName;
  222.     err = FSMakeFSSpec(theSpec.vRefNum, theSpec.parID, fileName, &theSpec);
  223.     fScriptFolder = theSpec;
  224.  
  225.     (CStr63 &)theSpec.name = globalsScriptName;
  226.     AliasHandle theAliasHdl = NULL;
  227.     err = NewAliasMinimal(&theSpec, &theAliasHdl);
  228.     if (err == noErr)
  229.     {
  230.         CAEDesc globalsAliasDesc(typeAlias, (Handle)theAliasHdl);
  231.         FailOSErr(globalsScript.SetScript(theCmp, globalsAliasDesc, 
  232.                                           kOSAModeCompileIntoContext, kOSAModeNull));
  233.         COSAScript::SetGlobalScript(globalsScript);
  234.         stdScriptsFound++;
  235.     }
  236.     theAliasHdl = (AliasHandle)DisposeIfHandle((Handle)theAliasHdl);
  237. }
  238.  
  239. //----------------------------------------------------------------------------------------
  240. // TScriptMenuBehavior::InstallSharedScript: 
  241. //----------------------------------------------------------------------------------------
  242. #pragma segment AOpen
  243.  
  244. void TScriptMenuBehavior::InstallSharedScript(ComponentInstance theCmp,
  245.                                               const CStr63& sharedScriptName,
  246.                                               long& stdScriptsFound)
  247. {
  248.     OSErr err = noErr;
  249.     FSSpec theSpec = fScriptFolder;
  250.     (CStr63 &)theSpec.name = sharedScriptName;
  251.     AliasHandle theAliasHdl = NULL;
  252.     err = NewAliasMinimal(&theSpec, &theAliasHdl);
  253.     if (err == noErr)
  254.     {
  255.         CAEDesc sharedAliasDesc(typeAlias, (Handle)theAliasHdl);
  256.         COSAScript sharedScript;
  257.         FailOSErr(sharedScript.SetScript(theCmp, sharedAliasDesc, kOSAModeCompileIntoContext, kOSAModeNull));
  258.         COSAScript::SetSharedScript(sharedScript);
  259.         stdScriptsFound++;
  260.     }
  261.     theAliasHdl = (AliasHandle)DisposeIfHandle((Handle)theAliasHdl);
  262. }
  263.  
  264. //----------------------------------------------------------------------------------------
  265. // TScriptMenuBehavior::ExecuteStartupScript: 
  266. //----------------------------------------------------------------------------------------
  267. #pragma segment AOpen
  268.  
  269. void TScriptMenuBehavior::ExecuteStartupScript(ComponentInstance theCmp,
  270.                                                const CStr63& startupScriptName,
  271.                                                long& stdScriptsFound)
  272. {
  273.     OSErr err = noErr;
  274.     {
  275.         FSSpec theSpec = fScriptFolder;
  276.         (CStr63 &)theSpec.name = startupScriptName;
  277.         AliasHandle theAliasHdl = NULL;
  278.         err = NewAliasMinimal(&theSpec, &theAliasHdl);
  279.         if (err == noErr)
  280.         {
  281.             CAEDesc startupAliasDesc(typeAlias, (Handle)theAliasHdl);
  282.             COSAScript startupScript;
  283.             FailOSErr(startupScript.SetScript(theCmp, startupAliasDesc, kOSAModeCompileIntoContext, kOSAModeNull));
  284.             COSAScript aResult;
  285.             COSAScript globalsScript = COSAScript::GetGlobalScript();
  286.             Boolean hasGlobals = (globalsScript != kOSANullScript);
  287.             Boolean sharedScript = (globalsScript != kOSANullScript);
  288.             startupScript.Execute(theCmp, globalsScript, kOSAModeNull, aResult.fScriptID);
  289.             aResult.DisposeScript(theCmp);
  290.             stdScriptsFound++;
  291.         }
  292.         theAliasHdl = (AliasHandle)DisposeIfHandle((Handle)theAliasHdl);
  293.     }
  294. }
  295.  
  296. //----------------------------------------------------------------------------------------
  297. // TScriptMenuBehavior::AddScriptMenu: 
  298. //----------------------------------------------------------------------------------------
  299. #pragma segment AOpen
  300.  
  301. void TScriptMenuBehavior::AddScriptMenu(const CStr63& globalsScriptName,
  302.                                         const CStr63& sharedScriptName,
  303.                                         const CStr63& startupScriptName,
  304.                                         long& stdScriptsFound)
  305. {
  306.     OSErr err = noErr;
  307.     
  308.     gApplication->SetupTheMenus();
  309.     long numScripts = 20;
  310.     FSSpec* theSpecs = (FSSpec *)NewPtr(sizeof(FSSpec) * numScripts);
  311.     FSSpec theSpec = fScriptFolder;
  312.     FindFiles('osas', 'ToyS', theSpec, numScripts, theSpecs);
  313.     if ((numScripts - stdScriptsFound) > 0)
  314.     {
  315.         CStr255 fileName;
  316.         MenuRef scriptMenu = MAGetMenu(mScripts);
  317.         MAInsertMenu(scriptMenu, mScripts, 0);
  318.         FSSpec * aScriptSpec = theSpecs;
  319.         short theMItem = 1;
  320.         while (numScripts--)
  321.         {
  322.             fileName = (CStr63 &)aScriptSpec->name;
  323.             if ((fileName != globalsScriptName) &&
  324.                 (fileName != sharedScriptName) &&
  325.                 (fileName != startupScriptName))
  326.             {
  327.                 AppendMenu(scriptMenu, (ConstStr255Param)"\ptemp");
  328.                 fileName = (CStr63 &)aScriptSpec->name;
  329.                 SetMenuItemText(scriptMenu, theMItem++, fileName);
  330.             }
  331.             aScriptSpec++;
  332.         }
  333.     }
  334.     InvalidateMenuBar();
  335.     theSpecs = (FSSpec *)DisposeIfPtr((Ptr)theSpecs);
  336. }
  337.  
  338. //----------------------------------------------------------------------------------------
  339. // TScriptMenuBehavior::DoMenuCommand:
  340. //----------------------------------------------------------------------------------------
  341. #pragma segment MASelCommand
  342.  
  343. void TScriptMenuBehavior::DoMenuCommand(CommandNumber aCommandNumber)
  344. {
  345.     CStr255 aName;
  346.     short menu;
  347.     short item;
  348.     CommandToMenuItem(aCommandNumber, menu, item);
  349.     if (menu == mScripts)
  350.     {
  351.         GetMenuItemText(MAGetMenu(menu), item, aName);
  352.         FSSpec theSpec = this->fScriptFolder;
  353.         (CStr63 &)theSpec.name = aName;
  354.         AliasHandle theAliasHdl = NULL;
  355.         OSErr err = noErr;
  356.         err = NewAliasMinimal(&theSpec, &theAliasHdl);
  357.         if (err == noErr)
  358.         {
  359.             ComponentInstance theCmp = COSAScript::GetDefaultComponent();
  360.             CAEDesc scriptAliasDesc(typeAlias, (Handle)theAliasHdl);
  361.             COSAScript theScript;
  362.             FailOSErr(theScript.SetScript(theCmp, scriptAliasDesc, kOSAModeCompileIntoContext, kOSAModeNull));
  363.             TExecuteScriptCommand* theCmd = new TExecuteScriptCommand;
  364.             theCmd->IExecuteScriptCommand(cNoCommand, (TCommandHandler *)fOwner, FALSE, FALSE, fOwner, theScript, kOSANullScript, kOSAModeNull, FALSE, theCmp);
  365.             fOwner->PostCommand(theCmd);
  366.             MAHiliteMenu(0);                        // Go ahead and unhilite the menu item since this script might
  367.             // cause a context switch and MacApp won't unhilite it until later.
  368.         }
  369.     }
  370.     else
  371.         Inherited::DoMenuCommand(aCommandNumber);
  372. }
  373.  
  374. //----------------------------------------------------------------------------------------
  375. // End of UScriptMenu.cp
  376.  
  377. #pragma segment Inline
  378.